package top.ytazwc.improve.factory;

import top.ytazwc.improve.adapter.ICacheAdapter;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @author 花木凋零成兰
 * @title JDKProxyFactory
 * @date 2024/4/28 17:26
 * @package top.ytazwc.improve.factory
 * @description 代理抽象工厂
 */
public class JDKProxyFactory {
    /**
     * 创建一个基于JDK的动态代理，用于缓存适配器接口
     * @param <T>             代理对象的类型
     * @param cacheClazz      要代理的缓存接口类
     * @param cacheAdapter    实现具体缓存逻辑的适配器类
     * @return                返回代理对象的实例
     * @throws Exception      当代理创建过程中发生错误时抛出异常
     */
    public static <T> T getProxy(Class<T> cacheClazz, Class<? extends ICacheAdapter> cacheAdapter) throws Exception {
        // 创建一个调用处理器，它将拦截代理对象的方法调用并委派给适配器的实例。
        InvocationHandler handler = new JDKInvocationHandler(cacheAdapter.newInstance());
        // 获取当前线程的类加载器，它将用于定义代理类。
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        // 使用类加载器、代理接口数组和调用处理器创建一个新的代理实例。
        // 强制类型转换是安全的，因为Java的类型擦除会确保在运行时T的具体类型是可知的。
        return (T) Proxy.newProxyInstance(classLoader, new Class[]{cacheClazz}, handler);
    }
}
